home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-04 / dsiic2.zip / L_SCRN4.C < prev    next >
C/C++ Source or Header  |  1991-07-15  |  2KB  |  81 lines

  1. /* Copyright (c) James L. Pinson 1990,1991  */
  2.  
  3. /**********************   L_SCRN4.C  ***************************/
  4.  
  5. #include "mydef.h"
  6. #include <dos.h>
  7.  
  8. #if defined QUICKC
  9.  
  10. #include "malloc.h"
  11. #include "memory.h"
  12.  
  13. #endif
  14.  
  15. #if defined TURBOC
  16.  
  17. #include "alloc.h"    /* Turbo C header file */
  18. #include "mem.h"
  19. #include "string.h"
  20. #include "stdlib.h"
  21.  
  22. #endif
  23.  
  24.  
  25. /*****************************************************************
  26.  
  27.  Usage: void alt_screen(int action);
  28.  
  29.  int action = ON or OFF.
  30.  
  31.  Turns on the alternate virtual screen.  The true video buffer is
  32.  copied to the alternate screen.  All output (screen writing,
  33.  window creation etc.) is routed to the alternate screen until
  34.  the command "alt_screen(OFF);" is issued.  The alternate screen
  35.  is then copied to the video buffer where it may be seen.
  36.  
  37. *****************************************************************/
  38.  
  39. void alt_screen(int action)
  40. {
  41. extern struct  screen_structure scr;
  42. extern struct window_structure w[];
  43.  
  44. static char far *v_screen;
  45. static char far *orig_screen;
  46. static int old_snow;
  47. static int old_update;
  48. int buffsize=scr.rows*scr.columns*sizeof(unsigned char)*2;
  49.  
  50.  if (action==1){   /* open alternate (virtual) screen */
  51.   if (orig_screen!=NULL)return;   /* screen already set */
  52.   old_update=scr.update;   /* save old update info */
  53.   scr.update=FALSE;   /* don't update cursor until done */
  54.  
  55.   old_snow=scr.snow;
  56.  
  57.   orig_screen=scr.buffer;  /* save original screen */
  58.   v_screen=(char far *)malloc(buffsize);  /* alloc new screen */
  59.   if(v_screen==NULL)return;  /* exit if allocation not made */
  60.    move_scr_mem(scr.buffer,v_screen,buffsize);
  61.    scr.snow=FALSE;
  62.    scr.buffer=v_screen;
  63.  }
  64.  
  65.  if (action==0){  /* close alternate screen */
  66.  
  67.   if(orig_screen==NULL)return;  /* not open */
  68.    scr.buffer=orig_screen;   /* reset buffer */
  69.    scr.snow=old_snow;
  70.      move_scr_mem(v_screen,scr.buffer,buffsize);
  71.  
  72.      scr.update=old_update;  /* we can update cursor now */
  73.      set_cursor(w[scr.active].start,w[scr.active].end);
  74.      goxy(w[scr.active].x,w[scr.active].y);
  75.  
  76.    /* release v_screen memory */
  77.    free((void *)v_screen); v_screen=NULL;  
  78.    orig_screen=NULL;
  79.  }
  80. }
  81.